Skip to content

Conversation

@YoonYn9915
Copy link
Member

@YoonYn9915 YoonYn9915 commented Apr 12, 2025

🌱WIL

이번 한 주의 소감을 작성해주세요!

  • 쉬운 계단 수 문제도 그렇고 계단 수문제도 그렇고 dp를 잘 안다고 생각했는데 이해가 잘 안됐다... dp배열에 자리수 n과 마지막 숫자 i를 기록하는 것과 0과 9는 앞에 한 개만(각각 1, 8) 올 수 있고 2-8은 앞에 두 개가 올 수 있다는 것도 알았는데 점화식 규칙을 왜 못찾았는지 잘 모르겠다. 계단 수 문제는 비트마스킹을 사용한다는 것이 새로웠다. 풀다가 좀 피곤해서 이런 문제가 코테 나올까 싶었는데 현대 소프티어에 이런 유형이 나와서 좀 피곤했다. 암튼 계단 수 문제는 못풀어서 꼭 다시 풀어야 될거 같다

🚀주간 목표 문제 수: 3개

푼 문제


백준 #10844. 쉬운 계단 수: DP / 실버1

정리한 링크: (바로가기)

🚩제출한 코드

N = int(input())

dp = [[0] * 10 for _ in range(N + 1)]

for i in range(1, 10):
    dp[1][i] = 1

for i in range(2, N + 1):
    for j in range(10):
        if j == 0:
            dp[i][j] = dp[i - 1][1]
        elif 1 <= j <= 8:
            dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]
        else:
            dp[i][j] = dp[i - 1][8]


print(sum(dp[N]) % 1000000000)

💡TIL

배운 점이 있다면 입력해주세요

백준 #1780. 종이의 개수: 재귀 / 실버2

정리한 링크: (바로가기)

🚩제출한 코드

import sys

def recursion(paper, row_start, col_start, step):
    # 종이가 같은지 검사
    result = check_paper_same(paper, row_start, col_start, step)

    # 같지 않다면 9분할한뒤 각각을 재귀적으로 검사
    if result == 2:
        for i in range(3):
            for j in range(3):
                row = row_start + (i * step // 3)
                col = col_start + (j * step // 3)
                recursion(paper, row, col, step // 3)
    else:
        # 종이의 칸이 다 같은 경우
        answer[result] += 1



def check_paper_same(paper, row_start, col_start, step):
    base = paper[row_start][col_start]
    for i in range(row_start, row_start + step):
        for j in range(col_start, col_start + step):
            if paper[i][j] != base:
                return 2
    return base


inp = sys.stdin.readline

n = int(inp())

paper = []

# 각각 -1, 0, 1로만 이루어진 종이의 개수 저장 딕셔너리
global answer
answer = {-1: 0, 0: 0, 1: 0}

for i in range(n):
    paper.append(list(map(int, inp().split())))

recursion(paper, 0, 0, n)

print('\n'.join(str(value) for value in answer.values()))

💡TIL

배운 점이 있다면 입력해주세요

  • print('\n'.join(str(v) for v in answer.values())) : 딕셔너리의 값들을 개행 문자로 연결해서 출력하는 코드
  • 위와 같은 방식으로 답을 출력할때 순서가 보장되지 않을 수 있으므로, 특정 순서로 출력하고 싶다면 명시적으로 key 순으로 출력 해야 함. for k in sorted(answer.keys()): print(answer[k])
  • 리스트 컴프리헨션을 사용한 2차원 리스트 슬라이싱.

백준 #1562. 계단수: DP / 골드1

정리한 링크: (바로가기)

🚩제출한 코드

import sys

input = sys.stdin.readline

N = int(input())
dp = [[[0 for _ in range(1 << 10)] for _ in range(10)] for _ in range(N)]
mod = 1000000000
res = 0

for k in range(1, 10):
    dp[0][k][1 << k] = 1

for i in range(1, N):
    for k in range(10):
        for bit in range(1024):
            if k - 1 >= 0:
                dp[i][k][bit | (1 << k)] += dp[i - 1][k - 1][bit]
            if k + 1 <= 9:
                dp[i][k][bit | (1 << k)] += dp[i - 1][k + 1][bit]
            dp[i][k][bit | (1 << k)] %= mod

for k in range(10):
    res += dp[N - 1][k][1023]
    res %= mod

print(res)

💡TIL

배운 점이 있다면 입력해주세요

Copy link
Collaborator

@Mingguriguri Mingguriguri left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DP 문제가 난이도가 높으면 점화식부터 막히더라구요... 계단수는 아예 접근조차 못했던 것 같네요ㅠㅠ
겨우 겨우 이해했는데 다른 비트마스킹 문제를 더 풀어봐야 할 것 같아요..

그래도 1주 간 고생 많으셨습니다!

Comment on lines +16 to +20
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분이 제 코드랑 다른 부분인 것 같네요!! else 부분 없이 조건을 이렇게 둬도 된다는 점을 배워갑니다!

# n: N번째 수
for n in range(2, N+1):
		# last_digit: 마지막 자리 숫자  
    for last_digit in range(10):
        # 0~9까지 모든 수를 방문해야 한다는 조건이 있으므로 방문여부를 비트마스킹을 통해 저장
        for mask in range(1024):
            if last_digit == 0:
                dp[n][last_digit][mask | (1 << last_digit)] += dp[n - 1][last_digit + 1][mask]
            elif last_digit == 9:
                dp[n][last_digit][mask | (1 << last_digit)] += dp[n - 1][last_digit - 1][mask]
            else:
                dp[n][last_digit][mask | (1 << last_digit)] += (
                        dp[n - 1][last_digit - 1][mask] + dp[n - 1][last_digit + 1][mask]
                )
            dp[n][last_digit][mask | (1 << last_digit)] %= MOD

@YoonYn9915 YoonYn9915 merged commit a3b24ba into main Apr 14, 2025
@github-actions
Copy link

🔥2025-04 챌린지 진행 상황

👉 그래프

  • YoonYn9915: 0개 ❌

👉 DP

  • YoonYn9915: 2개 ❌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants